<?php
/**
 * UsuarioDao
 *
 * Classe modelo DAO para representar as acoes do Usuario
 *
 */
class UsuarioDao extends Dao {

    /**
     * @var DependenteService
     */
    private $dependenteService;

    public function injectDependencies() {
        $this->dependenteService = DependenteService::getInstance();
    }

    /**
     * @method  atualizarDados
     *
     * Realiza a edicao de dados do usuario logado tanto no objeto de sessao
     * quanto no banco de dados
     *
     * @param   array   $ArDados    Post da view
     * @return  boolean
     * @since   2011-11-01
     */
    public function updatePessoalData($ArDados) {
        $Usuario = Dracosys::getLoggedUser();
        $Usuario->tMysqli->getConnection(MYSQL_HOST, MYSQL_USER,MYSQL_PASS, MYSQL_DB);
        $Usuario->tMysqli->escape($ArDados);
        $BoSalvo = $Usuario->updateUserData($ArDados);
        $Usuario->tMysqli->close();
        if( $BoSalvo ) {
            Dracosys::saveSessionValue(SESSION_SYSTEM, 'Usuario', $Usuario);
        }
        return $BoSalvo;
    }
    /**
     * @method  trocarSenha
     *
     * Edita a senha do usuario logado
     *
     * @param   string   $StNovaSenha    Nova senha do usuario
     * @return  boolean
     * @since   2011-11-12
     */
    public function changePassword($StNovaSenha) {
        $Usuario = Dracosys::getLoggedUser();
        $Usuario->tMysqli->getConnection(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DB);
        $Usuario->tMysqli->escape($StNovaSenha);
        $BoRetorno = $Usuario->updateUserData(array('StSenha'=>$StNovaSenha));
        $Usuario->tMysqli->close();
        if( $BoRetorno ) {
            Dracosys::saveSessionValue(SESSION_SYSTEM, 'Usuario', $Usuario);
        }
        return $BoRetorno;
    }
    /**
     * @method  updatePreferences
     *
     * Atualiza as preferencias do usuario logado
     *
     * @param   array   $ArPreferencias     Todas as preferencias do usuario
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   2011-11-23
     * @return  boolean
     */
    public function updatePreferences($ArPreferencias) {
        $Usuario = Dracosys::getLoggedUser();
        $Usuario->tMysqli->getConnection(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DB);
        $Usuario->tMysqli->escape($ArPreferencias);
        $BoReturn = $Usuario->updatePreferences($ArPreferencias);
        $Usuario->tMysqli->close();
        if( $BoReturn ) {
            Dracosys::saveSessionValue(SESSION_SYSTEM, 'Usuario', $Usuario);
        }
        return $BoReturn;
    }
    /**
     * @method  findById
     *
     * Carrega uma instancia de usuario atraves do ID no sistema
     *
     * @param   int     $IDUsuario  Id do usuario no sistema
     * @return  Usuario
     * @since   2011-11-09
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function findById($IDUsuario) {
        if(!$IDUsuario) { return; }
        $this->initConnection();
        $this->tMysqli->escape($IDUsuario);
        $Usuario = $this->loadUser($IDUsuario);
        $this->closeConnection();
        return $Usuario;
    }
    /**
     * @method  findAll
     *
     * Seleiona todos os usuarios do sistema para uma listagem.
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @return  array
     * @since   2011-12-05
     */
    public function findAll($AsSimple = false) {
        $StSql = TQuery::getSqlFindAllUser();
        $this->initConnection();
        $tQuery = $this->tMysqli->exec($StSql);
        $ArUsers = array();
        while($ArUserData = mysqli_fetch_assoc($tQuery)) {
            $ArUsers[] = !$AsSimple ? $this->loadUser($ArUserData['IDUsuario']) : $this->loadSimpleUser($ArUserData['IDUsuario']);
        }
        $this->closeConnection();
        return $ArUsers;
    }

    private function loadSimpleUser($IDUsuario) {
        return new Usuario($IDUsuario, $this->tMysqli, true);
    }

    private function loadUser($IDUsuario) {
        return new Usuario($IDUsuario, $this->tMysqli);
    }

    /**
     * @method  findUserByStatus
     *
     * Seleciona todos os usuarios com determinado status (Demitido ou Ativo)
     *
     * @param   string  StStatus   Status que sera o filtrador da consulta
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @return  array
     * @since   2011-12-05
     */
    public function findUsersByStatus($StStatus) {
        $StSql = TQuery::getSqlFindUserByStatus($StStatus);
        $this->initConnection();
        $this->tMysqli->escape($StStatus);
        $tQuery = $this->tMysqli->exec($StSql);
        $ArUsers = array();
        while( $ArIdUsuario = mysqli_fetch_assoc($tQuery) ) {
            $ArUsers[] = new Usuario($ArIdUsuario['IDUsuario'], $this->tMysqli);
        }
        $this->closeConnection();
        return $ArUsers;
    }

    //25-04
    public function findUserBySector($IDSetor) {
        $StSql = TQuery::getSqlFindUserBySector($IDSetor);
        $this->initConnection();
        $this->tMysqli->escape($IDSetor);
        $tQuery = $this->tMysqli->exec($StSql);
        $ArUsers = array();
        while( $ArIdUsuario = mysqli_fetch_assoc($tQuery) ) {
            $ArUsers[] = new Usuario($ArIdUsuario['IDUsuario'], $this->tMysqli);
        }
        $this->closeConnection();
        return $ArUsers;
    }

    //29-04
    public function dismiss($IDUsuario) {
        $this->initTransaction();
        $this->tMysqli->escape($IDUsuario);
        $StSqlDismissEmployee = TQuery::getSqlUpdateDismissEmployee($IDUsuario);
        $StSqlUserSector = TQuery::getSqlDeleteUserSector($IDUsuario);
        $this->tMysqli->exec($StSqlDismissEmployee);
        $this->tMysqli->exec($StSqlUserSector);
        $this->closeTransaction();
        return $this->tMysqli->lastTransactionReturn();
    }

    public function changeSector($IDUsuario, $IDSetor) {
        $this->initConnection();
        $this->tMysqli->escape($IDUsuario);
        $this->tMysqli->escape($IDSetor);
        $StSql = TQuery::getSqlUpdateChangeSector($IDUsuario, $IDSetor);
        $this->tMysqli->exec($StSql);
        $BoReturn = $this->tMysqli->lastQueryReturn();
        $this->closeConnection();
        return $BoReturn;
    }

    public function findByPosition($IDFuncao) {
        $this->initConnection();
        $this->tMysqli->escape($IDFuncao);
        $StSql = TQuery::getSqlFindUserByPosition($IDFuncao);
        $tQuery = $this->tMysqli->exec($StSql);
        $ArUsers = array();
        while($ArUserData = mysqli_fetch_assoc($tQuery)) {
            $ArUsers[] = new Usuario($ArUserData['IDUsuario'], $this->tMysqli, true);
        }
        $this->closeConnection();
        return $ArUsers;
    }

    public function changePosition($ArUsersId) {
        $this->initTransaction();
        $this->tMysqli->escape($ArUsersId);
        foreach( $ArUsersId as $IDUsuario => $IDFuncao) {
            $StSql = TQuery::getSqlUpdateChangePositionUserById($IDFuncao, $IDUsuario);
            $this->tMysqli->exec($StSql);
        }
        $this->closeTransaction();
        return $this->tMysqli->lastTransactionReturn();
    }

    public function findByProfile($IDPerfil) {
        $this->initConnection();
        $this->tMysqli->escape($IDPerfil);
        $StSql = TQuery::getSqlFindUserByProfile($IDPerfil);
        $tQuery = $this->tMysqli->exec($StSql);
        $ArUsers = array();
        while($ArUserData = mysqli_fetch_assoc($tQuery)) {
            $ArUsers[] = new Usuario($ArUserData['IDUsuario'], $this->tMysqli);
        }
        $this->closeConnection();
        return $ArUsers;
    }

    public function changeProfile($ArProfilesId) {
        $this->initTransaction();
        $this->tMysqli->escape($ArProfilesId);
        foreach( $ArProfilesId as $IDUsuario => $IDPerfil) {
            $StSql = TQuery::getSqlUpdateChangeUserProfile($IDUsuario, $IDPerfil);
            $this->tMysqli->exec($StSql);
        }
        $this->closeTransaction();
        return $this->tMysqli->lastTransactionReturn();
    }

    public function findUserWithPendingPayment() {
        $this->initConnection();
        $StSql = TQuery::getSqlFindUsersWithPendingPayment();
        $tQuery = $this->tMysqli->exec($StSql);
        $ArUsers = array();
        while($ArUserData = mysqli_fetch_assoc($tQuery)) {
            $Usuario = new Usuario($ArUserData['IDUsuario'], $this->tMysqli, true);
            $Usuario->setReport( array('NumberOfPaymentsToDo' => $ArUserData['NumberOfPaymentsToDo'], 'NumberOfPayments' => $ArUserData['NumberOfPayments']) );
            $ArUsers[] = $Usuario;
        }
        $this->closeConnection();
        return $ArUsers;
    }

    public function findUserInTimelyPayment() {
        $this->initConnection();
        $StSql = TQuery::getSqlFindUsersInTimelyPayment();
        echo $StSql;
        $tQuery = $this->tMysqli->exec($StSql);
        $ArUsers = array();
        while($ArUserData = mysqli_fetch_assoc($tQuery)) {
            $Usuario = new Usuario($ArUserData['IDUsuario'], $this->tMysqli);
            $Usuario->setReport( array('NumberOfPaymentsToDo' => $ArUserData['NumberOfPaymentsToDo'], 'NumberOfPayments' => $ArUserData['NumberOfPayments']) );
            $ArUsers[] = $Usuario;
        }
        $this->closeConnection();
        return $ArUsers;
    }

    public function findSimpleUserById($IDUsuario) {
        if(!$IDUsuario) { return; }
        $this->initConnection();
        $this->tMysqli->escape($IDUsuario);
        $Usuario = new Usuario($IDUsuario, $this->tMysqli, true);
        $this->closeConnection();
        return $Usuario;
    }

}

?>
